package oo

import "fmt"

//类型别名和基于现有类型定义新类型

//基于现有类型定义新类型，与现有类型不是同一类型,不具有底层类型的方法，
//可以对新类型新加方法,新方法不会附加到原类型
type Man Person

func (m *Man) printMan() {
	fmt.Printf("%#v\n", m)
}

//给类型起别名，与现有类型是同一类型，具有底层类型的方法，
//可对别名附加新方法,新方法会同时附加到原类型
type People = Person

func (p *People) printPeople() {
	fmt.Printf("%#v\n", p)
}

func testType() {

	person := Person{
		age: 23,
	}
	//person同时拥有了printPeople,但没有printMan方法
	person.printPeople()

	man := Man{
		age: 34,
	}

	//Man只具有自己方法，不具有底层类型方法
	man.printMan()

}


//类型断言
func TypeAssert() {
	var x interface{}
	x = "pprof.cn"
	//返回两个参数，第一个参数是x转化为T类型后的变量，第二个值是一个布尔值，若为true则表示断言成功，为false则表示断言失败。
	v, ok := x.(string)
	if ok {
		fmt.Println(v)
	} else {
		fmt.Println("类型断言失败")
	}
}


//类型判断
func justifyType(x interface{}) {
	switch v := x.(type) {
	case string:
		fmt.Printf("x is a string，value is %v\n", v)
	case int:
		fmt.Printf("x is a int is %v\n", v)
	case bool:
		fmt.Printf("x is a bool is %v\n", v)
	default:
		fmt.Println("unsupport type！")
	}
}







